#ifndef MESSAGER_H
#define MESSAGER_H
#include <QString>
#include <QUdpSocket>
#include <QTcpServer>
#include <QTcpSocket>
#include <QJsonObject>
#include <QJsonDocument>
#include "networker.h"

// 接收消息的回调函数
typedef void (*simpleCallback)(QObject *) ;
typedef void (*callback)(QString) ;
// 点对点消息通信
// 实现原理：
// 1. 基于TCP协议，对等通信，参与双方都有客户端和服务端；
// 2. 参与者上线后广播上线消息，如果有另一个参与者在线，则互换ip及消息接收端口，建立连接；
//
class P2PMessager : public QObject
{
    Q_OBJECT
private:
    P2PMessager();

public:
    static QString gap;// tcp数据包分割线
    bool connected; // 连接上另外一个参与者时，设置为true
    QString serverIp;// 对方的ip
    QString myIp;// 我的ip

    P2PMessager(const P2PMessager&)=delete;
    P2PMessager& operator=(const P2PMessager&)=delete;
    static P2PMessager& get_instance(){
        static P2PMessager instance;
        return instance;

    }

    void ready(simpleCallback);

    void send(QString);
    void listen(callback);

private slots:
    void readUDPData();
    void newTCPConnection();//断开连接
    void disconnected();//断开连接
    void readTCPData();
private:
    const quint16 udpPort;
    const quint16 tcpPort;
    QUdpSocket *udpSocket;
    QTcpServer *tcpServer;
    QTcpSocket * tcpServerSocket;
    QTcpSocket * tcpClientSocket;
    simpleCallback tcpConnectionReadyCallback;
    callback tcpReceiveMessageCallback;

private:
    void createTCPServer();
    void connectToTCPServer(QString);
    void findEachOther();
    void broadCastOnLineMsg();
};

#endif // MESSAGER_H
